__author__ = 'menangen'
# -*- coding: UTF-8 -*-
# enable debugging
import cgi, cgitb, os, msvcrt
cgitb.enable()
from string import Template
from stat import ST_SIZE

# Максимально нужный размер в Мбайтах
maxSIZE = 0.1

# HTML'ка для рендеринга
TEMPLATE = "good_upload.html"
# переменные для вывода (кортеж)
TMP_VARIABLES = {"list_as_string":"", "bad_list_as_string":""}
# список безпроблемно загруженных файлов
goodUploadedFiles = []
errorFiles = []

error_string = """
    <html !DOCTYPE>
    <style type="text/css">

    BODY, HTML {
        font-family: Helvetica, Verdana, Arial, sans-serif;
        font-size:10px;
        margin-left: 150px;

    }

    </style>
    <body><h1>
    Sorry! Not file sended <p />
    Извините, этот служебный скрипт был вызван неправильно!
    </h1>


    <!--<script>
    document.location = "/music.py";
    </script>
    -->
    </body>
    </html>
    """

try: # Windows needs stdio set for binary mode. Установить побайтовый режим записи (не текстовый)
    msvcrt.setmode(0, os.O_BINARY) # stdin  = 0
    msvcrt.setmode(1, os.O_BINARY) # stdout = 1
except ImportError:
    pass

# нормальный ли размер файла?
def isNormal(filesize):
    return filesize < (maxSIZE * 1048576)

# Получить файл из формы
form = cgi.FieldStorage()
# если файла нет
if not form:
    print error_string
# Пришёл файл или файлы
elif form.has_key('form_file'):

        files = form['form_file']
        # if files[0].type == 'image/jpeg'

        # есть ли папка для приёма? /files
        if not os.path.exists('files/'):
            os.mkdir('files')

        # If only one file is for uploading
        if type(files).__name__ == "instance":
            if files.file:
                # file name === music.mp3
                filename = os.path.basename(files.filename)
                # Статичная информация о файле. Модуль stat
                information = os.fstat(files.file.fileno())
                # размер файла. Модуль stat
                filesize = information[ST_SIZE]

                # Если размер файла не превышает
                if isNormal(filesize):
                    # запись потока в файл
                    fwrite = open('files/' + filename, 'wb').write(files.file.read())
                    # Добавим в список загруженных
                    goodUploadedFiles.append(filename)
                else:
                    errorFiles.append(filename)
            #else:
                #message = 'Ошибки во время загрузки('

        else:
        # если много файлов

            for a in files:
                # индекс файла по счёту
                index = files.index(a)
                # имя файла
                filename = os.path.basename(files[index].filename)
                #print name
                information = os.fstat(files[index].file.fileno())
                # размер файла. Модуль stat
                filesize = information[ST_SIZE]
                #print filesize

                # Если размер файла не превышает
                if isNormal(filesize):
                    # запись потока в файл
                    fwrite = open('files/' + filename, 'wb').write(files[index].file.read())
                    # Добавим в список загруженных
                    goodUploadedFiles.append(filename)
                else:
                    errorFiles.append(filename)

        # Текстовый режим записи файлов
        msvcrt.setmode(0, os.O_BINARY)
        file = open(TEMPLATE, "r")
        lines = file.readlines()

        template_HTML = ""

        try:
            for i in lines:
                template_HTML += i
        finally: file.close()

        template = Template(template_HTML)
        # Ouside HTML5 output with
        # message variable
        print "Content-Type: text/html;charset=utf-8"
        print


        for iterator in goodUploadedFiles:
            TMP_VARIABLES["list_as_string"] += iterator + '<br />'
        for iterator in errorFiles:
            TMP_VARIABLES["bad_list_as_string"] += iterator + '<br />'
        print template.substitute(TMP_VARIABLES)
